#include "74hc595.h"

// 初始化函数：添加DWT延时初始化（确保delay_us可用）
void hc595_init(void)
{
    // 初始化默认状态
    HC595_DS_LOW();
    HC595_SHCP_LOW();
    HC595_STCP_LOW();
}

// 数据发送函数 (32位)：添加时序延时
void hc595_send(uint32_t data)
{
    // 锁存引脚拉低（准备接收数据）
    HC595_STCP_LOW();
    // delay_us(1); // 确保锁存信号稳定拉低

    // 从高位(第31位)到低位(第0位)依次发送
    for (int8_t i = 31; i >= 0; i--)
    {
        HC595_SHCP_LOW(); // 时钟拉低，准备数据
        // delay_us(1); // 确保时钟拉低稳定

        // 设置数据位（DS信号）
        if (data & (1UL << i)) // 1UL 为 32位无符号整数1
        {
            HC595_DS_HIGH();
        }
        else
        {
            HC595_DS_LOW();
        }
        
        // 关键：数据建立时间延时（确保数据在时钟上升沿前稳定）
        // delay_us(1); // 至少满足74HC595的建立时间（典型值20ns，1us足够）

        // 时钟上升沿：移位数据
        HC595_SHCP_HIGH();
        // 关键：时钟脉冲宽度延时（确保时钟高电平持续时间足够）
        // delay_us(1); // 满足74HC595的时钟脉冲宽度要求（典型值50ns，1us足够）
    }

    // 确保最后一位数据已移位完成
    HC595_SHCP_LOW();
    // delay_us(1);

    // 锁存引脚上升沿：将移位寄存器数据复制到输出寄存器
    HC595_STCP_HIGH();
    // delay_us(1); // 确保锁存信号稳定，数据完全锁存
    HC595_STCP_LOW(); // 复位锁存引脚，准备下次发送
}